package info.ozkan.vipera.dao.doctor; import info.ozkan.vipera.business.doctor.DoctorManagerError; import info.ozkan.vipera.entities.Doctor; import info.ozkan.vipera.entities.DoctorNotificationSetting; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.inject.Named; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; /** * Hekim veritabanı üzerinde işlem yapan Dao sınıfı * * @author Ömer Özkan * */ @Named("doctorDao") public class DoctorDaoImpl implements DoctorDao { /** * Hekimi api ile arar */ private static final String JQL_BY_API = "from Doctor d WHERE d.apiKey = :apiKey"; /** * Hekimi id ile arar */ private static final String JQL_GET_BY_ID = "from Doctor d where d.id = :id"; /** * hekimi tckn ile arar */ protected static final String JQL_GET_BY_TCKN = "from Doctor d where d.tckn = :tckn"; /** * Persistence nesne */ private EntityManager em; /* * (non-Javadoc) * * @see info.ozkan.vipera.dao.doctor.DoctorDao#add(info.ozkan.vipera * .entities.Doctor) */ public DoctorDaoResult add(final Doctor doctor) { final DoctorDaoResult result = new DoctorDaoResult(); em.persist(doctor); for (final DoctorNotificationSetting setting : doctor.getSettings()) { em.merge(setting); } result.setSuccess(true); return result; } /** * {@link DoctorBrowseFilter} nesnesini {@link CriteriaQuery} nesnesine * dönüştürür * * @param filter * filtre * @return */ private CriteriaQuery<Doctor> creataCriteriaQueryFromFilter( final DoctorBrowseFilter filter) { final CriteriaBuilder cb = em.getCriteriaBuilder(); final CriteriaQuery<Doctor> cq = cb.createQuery(Doctor.class); final Root<Doctor> root = cq.from(Doctor.class); final Map<String, Object> filters = filter.getFilters(); final List<Predicate> predicates = new ArrayList<Predicate>(); for (final String attr : filters.keySet()) { final Object obj = filters.get(attr); if (obj != null && !obj.toString().isEmpty()) { final String pattern = '%' + obj.toString() + '%'; predicates.add(cb.like( root.<String> get(attr).as(String.class), pattern)); } } cq.select(root).where(predicates.toArray(new Predicate[0])); return cq; } public DoctorDaoResult delete(final Doctor doctor) { final DoctorDaoResult result = new DoctorDaoResult(); em.remove(em.merge(doctor)); result.setSuccess(true); result.setDoctor(doctor); return result; } /** * Filtrelere göre veritabanında arama işlemi yapar */ public List<Doctor> find(final DoctorBrowseFilter filter) { final CriteriaQuery<Doctor> cq = creataCriteriaQueryFromFilter(filter); return em.createQuery(cq).getResultList(); } public DoctorDaoResult getById(final Long id) { final DoctorDaoResult result = new DoctorDaoResult(); final Query query = em.createQuery(JQL_GET_BY_ID); query.setParameter(Doctor.ID, id); final List<Doctor> doctors = query.getResultList(); if (doctors.size() == 0) { result.setSuccess(false); result.setError(DoctorManagerError.DOCTOR_NOT_EXIST); } else { result.setSuccess(true); result.setDoctor(doctors.get(0)); } return result; } /** * Veritabanından TCKN'ye ait hekimi sorgular * * @param tckn * TC Kimlik No * @return Doctor nesnesi */ public DoctorDaoResult getByTckn(final Long tckn) { final Query query = em.createQuery(JQL_GET_BY_TCKN); query.setParameter(Doctor.TCKN, tckn); final DoctorDaoResult result = new DoctorDaoResult(); final List resultList = query.getResultList(); getSingleResult(result, resultList); return result; } /** * Eğer kayıt varsa ilk kaydı sonuca ekler * * @param result * @param resultList */ private void getSingleResult(final DoctorDaoResult result, final List resultList) { if (resultList.size() == 0) { result.setSuccess(false); result.setError(DoctorManagerError.DOCTOR_NOT_EXIST); } else { result.setSuccess(true); result.setDoctor((Doctor) resultList.get(0)); } } /** * Persistence nesne * * @param em */ @PersistenceContext public void setEntityManager(final EntityManager em) { this.em = em; } public DoctorDaoResult update(final Doctor doctor) { final DoctorDaoResult result = new DoctorDaoResult(); em.merge(doctor); for (final DoctorNotificationSetting setting : doctor.getSettings()) { em.merge(setting); } result.setSuccess(true); result.setDoctor(doctor); return result; } public DoctorDaoResult getByApi(final String apiKey) { final DoctorDaoResult result = new DoctorDaoResult(); final Query query = em.createQuery(JQL_BY_API); query.setParameter("apiKey", apiKey); final List<Doctor> resultList = query.getResultList(); getSingleResult(result, resultList); return result; } }